package MotorRegras;

import util.Constantes;
import Jplay.TileInfo;
import MotorGrafico.Indice;
import MotorGrafico.Tabuleiro;

/**
 * Classe responsavel por validar o movimento do peao.
 * 
**/
class RegrasPeao {

	/**
	 * Verifica se o movimento do peao � valido.
	 * 
	 * @param t Tabuleiro
	 * @param origem Posicao da peca que se quer validar o movimento.
	 * @param alvo Posicao alvo da movimentacao da peca.
	 * @return true, se movimento valido, false, ao contrario.
	 */
	public static boolean valMovPeao(Indice origem, Indice alvo, Tabuleiro t) {
		TileInfo tile = t.getTile(origem.i, origem.j);

		// Quantidade de deslocamento na linha.
		int descI = origem.i - alvo.i;

		// Inverte o sentido do descolamento dependendo do peao.
		int sinal = tile.id == Constantes.WHITE_PEAO ? 1 : -1;

		// Verifica se a quantidade de linhas a andar  2 e se eh a primeira jogada do peao.
		int qtCasasAndar = 0;

		if (Math.abs(descI) == 2 && origem.i != 1 && Tabuleiro.isPecaNegra(t.getPeca(origem.i, origem.j)))
			
			return false;

		if (Math.abs(descI) == 2 && origem.i != 6 && Tabuleiro.isPecaBranca(t.getPeca(origem.i, origem.j)))
			return false;

		if (Math.abs(descI) == 2)
			qtCasasAndar = 2;
			
		else
			qtCasasAndar = 1;

		// Verifica se o peao est� tentando andar para tr�s
		if (descI != qtCasasAndar * sinal)
			return false;

		// Quantidade de descolamento nas colunas
		int descJ = origem.j - alvo.j;

		if (Math.abs(descI) >= 2 && Math.abs(descJ) != 0 )
			return false;		

		if (Math.abs(descI) == 2 && Math.abs(descJ) != 0 )
			return false;		

		// Se o peao tentar se deslocar mais de uma casa em rela��o as colunas
		// retorna false
		if (Math.abs(descJ) > 1)
			return false;

		// Verifica se o pe�o est� se movendo em linha reta e se h� uma peca a
		// sua frente.
		if (descJ == 0 && t.getPeca(alvo.i, alvo.j) != Constantes.ESTADO_VAZIO)
			return false;

		// Verificar se o peao est� tentando pular alguma pe�a no caminho.
		if (qtCasasAndar == 2 && descJ == 0)
			return !Regras.haPecaNoCaminho(new Indice(-sinal, 0), origem,
					qtCasasAndar, t);

		// Verifica se o peao esta se deslocamento na mesma coluna.
		if (descJ == 0)
			
			return true;
		
		
		// Verifica se ha alguma peca onde o peao esta tentando se movimentar.
		if (t.getPeca(alvo.i, alvo.j) != Constantes.ESTADO_VAZIO)
			return true;
		
		
		if(Regras.enPassant(origem, t, Regras.retornaListaEnPassant())){
			return true;
		}

		return false;
	}

	/**
	 * Verifica se o peao esta em promocao.
	 * 
	 * @param Indice Posicao do peao.
	 * @param tab Tabuleiro
	 * @return boolean true se o peao esta em promocao, ao contrario false.
	 */

	public static boolean peaoEmPromocao(Indice ind, Tabuleiro tab) {
		int id = tab.getPeca(ind.i, ind.j);

		if (ind.i == 0 || ind.i == 7 && (id == Constantes.WHITE_PEAO || id == Constantes.BLACK_PEAO))
			return true;

		return false;
	}

	/**
	 * Retorna um booleano que representa se o peao esta em primeira jogada ou nao.
	 * @param Indice - Indice origem
	 * @param Indice - Indice alvo
	 * @param t - Tabuleiro
	 */
	public static boolean primeiraJogada(Indice origem, Tabuleiro t) {

		int tipoPeao = t.getPeca(origem.i, origem.j);
		if (origem.i == 3 && Tabuleiro.isPecaNegra(tipoPeao))
			return true;
		if (origem.i == 4 && Tabuleiro.isPecaBranca(tipoPeao))
			return true;

		return false;

	}



}
